package com.meimeixia.pattern.singleton.demo4;

/**
 * 双重检查锁
 * @author: t-zhijiang.zhao
 * @date: 2024/11/26 上午9:28
 */
public class Singleton2 {
    // 私有构造方法
    private Singleton2() {}

    // 声明Singleton类型的变量
    private static volatile Singleton2 instance;

    // 对外提供公共的访问方式
    public static Singleton2 getInstance() {
        // 第一次判断，如果instance的值不为null，那么就不需要抢占锁了，直接返回对象即可
        if (instance == null) {
            synchronized (Singleton2.class) {
                // 第二次判断
                if (instance == null) {
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }

    /*最后，我做一个总结，添加volatile关键字之后的双重检查锁方式是一种比较好的单例实现方式，能够保证在多线程的情况下线程安全，并且也不会有性能问题。*/
}
